/////////////////////////////////////////////////////////////////////////////
//
//! @file    mip_sdk_3dm.h
//! @author  Nathan Miller
//! @version 1.1
//
//! @description MIP 3DM Descriptor Set Definitions
//
// External dependencies:
//
//
//
//!@copyright 2014 Lord Microstrain Sensing Systems.
//
//!@section CHANGES
//!
//
//!@section LICENSE
//!
//! THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING
//! CUSTOMERS WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER
//! FOR THEM TO SAVE TIME. AS A RESULT, LORD MICROSTRAIN SENSING SYSTEMS
//! SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES
//! WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE AND/OR
//! THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION
//! WITH THEIR PRODUCTS.
//
/////////////////////////////////////////////////////////////////////////////

#ifndef _MIP_SDK_3DM_H
#define _MIP_SDK_3DM_H

////////////////////////////////////////////////////////////////////////////////
//
// Include Files
//
////////////////////////////////////////////////////////////////////////////////

#include "mip.h"
#include "mip_gx4_25.h"
#include "mip_sdk_ahrs.h"
#include "mip_sdk_config.h"
#include "mip_sdk_gps.h"
#include "mip_sdk_interface.h"

////////////////////////////////////////////////////////////////////////////////
//
// Defines
//
////////////////////////////////////////////////////////////////////////////////

//! @def

////////////////////////////////////////////////////////////////////////////////
//
// Descriptor Set designators - used in the Desc Set field of the MIP header
//
////////////////////////////////////////////////////////////////////////////////

#define MIP_3DM_COMMAND_SET 0x0C

////////////////////////////////////////////////////////////////////////////////
// 3DM COMMAND DESCRIPTORS (command desc are < 0x80)
////////////////////////////////////////////////////////////////////////////////

#define MIP_3DM_CMD_POLL_AHRS_MESSAGE 0x01
#define MIP_3DM_CMD_POLL_GPS_MESSAGE 0x02
#define MIP_3DM_CMD_POLL_NAV_MESSAGE 0x03
#define MIP_3DM_CMD_GET_AHRS_BASE_RATE 0x06
#define MIP_3DM_CMD_GET_GPS_BASE_RATE 0x07
#define MIP_3DM_CMD_AHRS_MESSAGE_FORMAT 0x08
#define MIP_3DM_CMD_GPS_MESSAGE_FORMAT 0x09
#define MIP_3DM_CMD_NAV_MESSAGE_FORMAT 0x0A
#define MIP_3DM_CMD_GET_NAV_BASE_RATE 0x0B
#define MIP_3DM_CMD_CONTROL_DATA_STREAM 0x11
#define MIP_3DM_CMD_RAW_RTCM_2_3_MESSAGE 0x20
#define MIP_3DM_CMD_SAVE_DEVICE_SETTINGS 0x30
#define MIP_3DM_CMD_SET_GPS_DYNAMICS_MODE 0x34
#define MIP_3DM_CMD_SET_AHRS_SIGNAL_COND 0x35
#define MIP_3DM_CMD_SET_AHRS_TIMESTAMP 0x36
#define MIP_3DM_CMD_ACCEL_BIAS 0x37
#define MIP_3DM_CMD_GYRO_BIAS 0x38
#define MIP_3DM_CMD_CAPTURE_GYRO_BIAS 0x39
#define MIP_3DM_CMD_HARD_IRON_VECTOR 0x3A
#define MIP_3DM_CMD_SOFT_IRON_MATRIX 0x3B
#define MIP_3DM_CDM_CONING_AND_SCULLING_ENABLE 0x3E
#define MIP_3DM_CDM_SENSOR2VEHICLE_TRANSFORMATION 0x3F
#define MIP_3DM_CMD_UART_BAUDRATE 0x40
#define MIP_3DM_CMD_LOW_PASS_FILTER_SETTINGS 0x50
#define MIP_3DM_CMD_COMPLEMENTARY_FILTER 0x51
#define MIP_3DM_CMD_DATASTREAM_FORMAT 0x60
#define MIP_3DM_CMD_DEVICE_POWER_STATE 0x61
#define MIP_3DM_CMD_SAVE_RESTORE_GPS_SETTINGS 0x62
#define MIP_3DM_CMD_DEVICE_SETTINGS 0x63
#define MIP_3DM_CMD_DEVICE_STATUS 0x64

////////////////////////////////////////////////////////////////////////////////
// 3DM REPLY DESCRIPTORS (reply desc are >= 0x80)
////////////////////////////////////////////////////////////////////////////////

#define MIP_3DM_REPLY_AHRS_MESSAGE_FORMAT 0x80
#define MIP_3DM_REPLY_GPS_MESSAGE_FORMAT 0x81
#define MIP_3DM_REPLY_NAV_MESSAGE_FORMAT 0x82
#define MIP_3DM_REPLY_AHRS_BASE_RATE 0x83
#define MIP_3DM_REPLY_GPS_BASE_RATE 0x84
#define MIP_3DM_REPLY_DATASTREAM_ENABLE 0x85
#define MIP_3DM_REPLY_AHRS_SIGNAL_SETTINGS 0x86
#define MIP_3DM_REPLY_UART_BAUDRATE 0x87
#define MIP_3DM_REPLY_DATASTREAM_FORMAT 0x88
#define MIP_3DM_REPLY_POWER_STATE 0x89
#define MIP_3DM_REPLY_NAV_BASE_RATE 0x8A
#define MIP_3DM_REPLY_ADVANCED_DATA_FILTER 0x8B
#define MIP_3DM_REPLY_DEVICE_STATUS 0x90
#define MIP_3DM_REPLY_COMMUNICATIONS_MODE 0x91
#define MIP_3DM_REPLY_GPS_DYNAMICS_MODE 0x92
#define MIP_3DM_REPLY_AHRS_TIMESTAMP_VALUE 0x93
#define MIP_3DM_REPLY_COMPLEMENTARY_FILTER 0x97
#define MIP_3DM_REPLY_ACCEL_BIAS_VECTOR 0x9A
#define MIP_3DM_REPLY_GYRO_BIAS_VECTOR 0x9B
#define MIP_3DM_REPLY_HARD_IRON_VECTOR 0x9C
#define MIP_3DM_REPLY_SOFT_IRON_MATRIX 0x9D
#define MIP_3DM_REPLY_CONING_AND_SCULLING_ENABLE 0x9E
#define MIP_3DM_REPLY_SENSOR2VEHICLE_TRANSFORMATION 0x9F

////////////////////////////////////////////////////////////////////////////////
// 3DM PARAMETERS
////////////////////////////////////////////////////////////////////////////////

// Data Poll Option Byte
#define MIP_3DM_POLLING_ENABLE_ACK_NACK 0x00
#define MIP_3DM_POLLING_SUPPRESS_ACK_NACK 0x01

// Device Power State Device Mask Byte
#define MIP_3DM_POWER_STATE_DEVICE_AHRS 0x01
#define MIP_3DM_POWER_STATE_DEVICE_GPS 0x02

// Device Power State Byte
#define MIP_3DM_POWER_STATE_ON 0x01
#define MIP_3DM_POWER_STATE_LOW_POWER 0x02
#define MIP_3DM_POWER_STATE_SLEEP 0x03
#define MIP_3DM_POWER_STATE_OFF 0x04

// 3DM Device Settings Flags
#define MIP_3DM_AHRS_STREAM_ENABLED_FLAG 0x00000001
#define MIP_3DM_AHRS_STREAM_RAW_FORMAT_FLAG 0x00000002
#define MIP_3DM_GPS_STREAM_ENABLED_FLAG 0x00000100
#define MIP_3DM_GPS_STREAM_RAW_FORMAT_FLAG 0x00000200
#define MIP_3DM_NAV_STREAM_ENABLED_FLAG 0x00010000

// Data stream IDs
#define MIP_3DM_AHRS_DATASTREAM 0x01
#define MIP_3DM_GPS_DATASTREAM 0x02
#define MIP_3DM_INS_DATASTREAM 0x03

// Data stream communication format
#define MIP_3DM_DATASTREAM_NATIVE_MIP_FORMAT 0x01
#define MIP_3DM_DATASTREAM_WRAPPED_RAW_FORMAT 0x02

// GPS Dynamics Modes
#define MIP_3DM_GPS_DYNAMICS_MODE_PORTABLE 0x00
#define MIP_3DM_GPS_DYNAMICS_MODE_FIXED 0x01
#define MIP_3DM_GPS_DYNAMICS_MODE_STATIONARY 0x02
#define MIP_3DM_GPS_DYNAMICS_MODE_PEDESTRIAN 0x03
#define MIP_3DM_GPS_DYNAMICS_MODE_AUTOMOTIVE 0x04
#define MIP_3DM_GPS_DYNAMICS_MODE_SEA 0x05
#define MIP_3DM_GPS_DYNAMICS_MODE_AIRBORNE_1G 0x06
#define MIP_3DM_GPS_DYNAMICS_MODE_AIRBORNE_2G 0x07
#define MIP_3DM_GPS_DYNAMICS_MODE_AIRBORNE_4G 0x08

// IMU Low-Pass Filter Parameters
#define MIP_3DM_AHRS_LPF_DISABLED 0x00
#define MIP_3DM_AHRS_LPF_IIR_SINGLE_POLE 0x01
#define MIP_3DM_AHRS_LPF_MAX_FILTER MIP_3DM_AHRS_LPF_IIR_SINGLE_POLE
#define MIP_3DM_AHRS_LPF_CUTOFF_MANUAL 0x01
#define MIP_3DM_AHRS_LPF_CUTOFF_AUTOMATIC 0x00

// Coning and Sculling Compensation parameters
#define MIP_3DM_CONING_AND_SCULLING_DISABLE 0x00
#define MIP_3DM_CONING_AND_SCULLING_ENABLE 0x01

////////////////////////////////////////////////////////////////////////////////
//
// Structures
//
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
//
// Function Prototypes
//
////////////////////////////////////////////////////////////////////////////////

u16 mip_3dm_cmd_poll_ahrs(mip_interface* device_interface, u8 option_selector, u8 num_descriptors, u8* descriptor_list);
u16 mip_3dm_cmd_poll_gps(mip_interface* device_interface, u8 option_selector, u8 num_descriptors, u8* descriptor_list);
u16 mip_3dm_cmd_poll_filter(mip_interface* device_interface, u8 option_selector, u8 num_descriptors,
                            u8* descriptor_list);

u16 mip_3dm_cmd_get_ahrs_base_rate(mip_interface* device_interface, u16* base_rate);
u16 mip_3dm_cmd_get_gps_base_rate(mip_interface* device_interface, u16* base_rate);
u16 mip_3dm_cmd_get_filter_base_rate(mip_interface* device_interface, u16* base_rate);

u16 mip_3dm_cmd_ahrs_message_format(mip_interface* device_interface, u8 function_selector, u8* num_entries,
                                    u8* descriptors, u16* decimation);
u16 mip_3dm_cmd_gps_message_format(mip_interface* device_interface, u8 function_selector, u8* num_entries,
                                   u8* descriptors, u16* decimation);
u16 mip_3dm_cmd_filter_message_format(mip_interface* device_interface, u8 function_selector, u8* num_entries,
                                      u8* descriptors, u16* decimation);

u16 mip_3dm_cmd_continuous_data_stream(mip_interface* device_interface, u8 function_selector, u8 device_selector,
                                       u8* enable);
u16 mip_3dm_cmd_startup_settings(mip_interface* device_interface, u8 function_selector);

u16 mip_3dm_cmd_gps_dynamics_mode(mip_interface* device_interface, u8 function_selector, u8* dynamics_mode);
u16 mip_3dm_cmd_gps_advanced_settings(mip_interface* device_interface, u8 function_selector);

u16 mip_3dm_cmd_ahrs_signal_conditioning(mip_interface* device_interface, u8 function_selector,
                                         mip_ahrs_signal_settings* settings);
u16 mip_3dm_cmd_ahrs_timestamp(mip_interface* device_interface, u8 function_selector, u8* time_selector, u32* time);

u16 mip_3dm_cmd_uart_baudrate(mip_interface* device_interface, u8 function_selector, u32* baudrate);
u16 mip_3dm_cmd_datastream_format(mip_interface* device_interface, u8 function_selector, u8 device_selector,
                                  u8* format);
u16 mip_3dm_cmd_power_state(mip_interface* device_interface, u8 function_selector, u8 device_selector, u8* power_state);

u16 mip_3dm_cmd_device_status(mip_interface* device_interface, u16 model_number, u8 status_selector,
                              u8* response_buffer, u16* response_size);
u16 mip_3dm_cmd_low_pass_filter_settings(mip_interface* device_interface, u8 function_selector,
                                         mip_low_pass_filter_settings* filter_settings);

u16 mip_3dm_cmd_accel_bias(mip_interface* device_interface, u8 function_selector, float* bias_vector);
u16 mip_3dm_cmd_gyro_bias(mip_interface* device_interface, u8 function_selector, float* bias_vector);

u16 mip_3dm_cmd_coning_sculling_compensation(mip_interface* device_interface, u8 function_selector, u8* enable);
u16 mip_3dm_cmd_capture_gyro_bias(mip_interface* device_interface, u16 duration_ms, float* bias_vector);

u16 mip_3dm_cmd_hard_iron(mip_interface* device_interface, u8 function_selector, float* vector);
u16 mip_3dm_cmd_soft_iron(mip_interface* device_interface, u8 function_selector, float* matrix);

u16 mip_3dm_sensor2vehicle_tranformation(mip_interface* device_interface, u8 function_selector, float euler_angles[3]);

u16 mip_3dm_cmd_complementary_filter_settings(mip_interface* device_interface, u8 function_selector,
                                              mip_complementary_filter_settings* settings);

u16 mip_3dm_cmd_rtcm_23_message(mip_interface* device_interface, u8* raw_data, u16 num_bytes);

#endif
